#include <iostream>
#include <ostream>
#include <sstream>
//designed by realMarkYang,And Good night Reira，sweet dreams
#define NAME_VALUE(v) #v, " : ", (v)
namespace mk
{
    template <typename... Args>
    inline void raw_print(std::ostream &os, Args &...args)
    {
        std::ostringstream ss;
        ((ss << args), ...)
        os<< ss.str();
        ss.clear();
    }

    template <typename... Args>
    inline void print(Args &...args)
    {
        raw_print(std::cout, args...);
    }
    inline void print()
    {
        return;
    }
    template <typename... Args>

    inline void eprint(Args &...args)
    {
        raw_print(std::cerr, args...);
    }
    inline void eprint()
    {
        return;
    }

    template <typename T>
    class Range
    {
        T _start, _end, _step;

    public:
        constexpr Range()=delete;
        constexpr Range(T start,T end,T step):_start(start),_end(end),_step(step){}
        constexpr Range(T start,T end):noexcept Range(start,end,1){}
        constexpr Range(T end):noexcept Range(0,end,1){}

        struct iterator
        {
            T current;
            const T step;
            constexpr iterator()=delete;
            constexpr iterator(const T start,const T step):current(start),step(step){}
            constexpr iterator& operator++(){
                current+=step;
                return *this;
            }
            constexpr bool operator!=(const iterator& other)const noexcept{
                return current<other.current;
            }
            constexpr T& operator*()const noexcept{
                return current;
            }
        };
        constexpr iterator begin(){
            return iterator(_start,_step);
        }       
        constexpr iterator end(){
            return iterator(_end,_step)
        }
    };

}